//import jdk.incubator.vector.FloatVector;
//import jdk.incubator.vector.VectorOperators;
//import jdk.incubator.vector.VectorSpecies;
//
//public class MatrixSumBenchmark {
//    static float[][] a;
//    final static VectorSpecies<Float> SPECIES = FloatVector.SPECIES_PREFERRED;
//    static int width, length;
//    public static void main(String[] args) {
//        width = 8192;
//        length = 8192;
//        System.out.printf("Single vector size is %.2f MB%n", width * length * 32.0 / 1024 / 1024);
//        a = new float[length][width];
//        // assign random value to a and b
//        for (int i = 0; i < length; i++) {
//            for (int j = 0; j < width; j++) {
//                a[i][j] = (float) Math.random();
//            }
//        }
//        for(int i = 0; i < 10; i++) {
//            // warm up
//            addUsingVector();
//        }
//        long timeCostInVec = 0;
//        for(int i = 0; i < 10; i++) {
//            timeCostInVec += addUsingVector();
//        }
//        System.out.printf("Time cost in vector api is %.2f ns%n", timeCostInVec / 10.0);
//
//        // using loop to add a and b
//        for(int i = 0; i < 10; i++) {
//            // warm up
//            addUsingLoop();
//        }
//        long timeCostInLoop = 0;
//        for(int i = 0; i < 10; i++) {
//            timeCostInLoop += addUsingLoop();
//        }
//        System.out.printf("Time cost in loop is %.2f ns%n", timeCostInLoop / 10.0);
//    }
//
//    public static long addUsingVector() {
//        long startTime = System.nanoTime();
//        var v8sum = FloatVector.zero( SPECIES );
//        for (int i = 0; i < length; i++) {
//            for (int j = 0; j < width; j += SPECIES.length()) {
//                FloatVector va = FloatVector.fromArray(SPECIES, a[i], j);
//                v8sum = v8sum.add(va);
//            }
//        }
//        float result = v8sum.reduceLanes(VectorOperators.ADD);
//        long endTime = System.nanoTime();
//        return endTime- startTime;
//    }
//
//    public static long addUsingLoop() {
//        long startTime = System.nanoTime();
//        float result = 0;
//        for (int i = 0; i < length; i++) {
//            for (int j = 0; j < width; j++) {
//                result += a[i][j];
//            }
//        }
//        long endTime = System.nanoTime();
//        return endTime - startTime;
//    }
//}